package com.ry.aop.myaop;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * cglib 代理工厂
 */
public class ProxyFactory implements MethodInterceptor {

    private Object target;

    public UserService getProxy(Object target){

        this.target = target;

        // CGLIB  生成代理对象
        Enhancer enhancer = new Enhancer();

        // 设置父类class
        enhancer.setSuperclass(target.getClass());

        // 设置回调
        enhancer.setCallback(this);

        // 设置类加载器
        enhancer.setClassLoader(target.getClass().getClassLoader());

        return (UserService)enhancer.create();
    }

    // 这样不好，就算我只配置了一个前置通知，但是所有代码都写在了一起
    // 有没有办法提高灵活性、解耦合、该怎么办？
    // 责任链、调用链
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        // 执行目标方法


        Object result = null;
        try {
            // 前置通知
            System.out.println("前置通知");

            result = method.invoke(target, objects);

            // 返回通知
            System.out.println("返回通知");
        } catch (Throwable throwable){
            // 异常通知
            System.out.println("异常通知");
        } finally {
            // 后置通知
            System.out.println("后置通知");
        }

        return result;
    }
}
